#ifndef SQLPROVIDER_H
#define SQLPROVIDER_H

#include <string>
#include "MU_API.h"
#include "src/pubimp.h"
#include "device/mysqliteapi.h"
#include "src/SoftWare/SQL/SQLHelper.h"
#include <QDebug>
#include "src/Manager/ThreadPool.h"
#include <future>
#include "src/DataProvider/App/SysMembers.h"

typedef std::pair<std::string ,std::string>  File;  // 0:路径  1:名称

/// 任务清单
typedef std::tuple<int ,double,double,int ,bool> TaskList;  /// 0.任务编号  1.电压  2.电流  3.速度  4.状态

/// 记录的数据
typedef std::tuple<int ,int,double,double,double ,std::string> ResultList;  /// 0.任务编号 1.序号   2.width  3.height  4.radius  5.time

class sqlProvider
{
public:
    sqlProvider();

    static sqlProvider* GetInstance(){
        static QMutex mutex;
        static QScopedPointer<sqlProvider> inst;
        if (Q_UNLIKELY(!inst)) {
            mutex.lock();
            if (!inst) {
                inst.reset(new sqlProvider);
            }
            mutex.unlock();
        }
        return inst.data();
    }


    void Connect();


    QVariantList Get(std::string);

    /// 插入一条数据
    MU_RETURNS insert(TaskList);
    MU_RETURNS insert(ResultList);

    /// 通过任务编号查询
    TaskList getTask(int);
    ResultList getResult(int);

    MU_RETURNS reLoadDB();


    /// 第二部-读取数据
private:
    MU_RETURNS _open();

    void initBackThread();

private:
    std::string tb_name;    /// 所选择的表名

    /// 转换任意类型到表结构
    ResultList transVarToResult(QVariantList r);
    /// 转换任意类型到表结构
    TaskList   transVarToTask(QVariantList r);
};

#endif // SQLPROVIDER_H
